package com.bjpowernode.boss.mvc.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.bjpowernode.boss.constants.BoosConst;
import com.bjpowernode.boss.constants.KeyConst;
import com.bjpowernode.boss.convert.PayProductConvert;
import com.bjpowernode.boss.domain.PayProduct;
import com.bjpowernode.boss.enums.ajax.Code;
import com.bjpowernode.boss.mvc.model.dto.PageInfoDto;
import com.bjpowernode.boss.mvc.model.query.PayProductQuery;
import com.bjpowernode.boss.mvc.model.result.AjaxResult;
import com.bjpowernode.boss.mvc.model.vo.DitOptionVo;
import com.bjpowernode.boss.mvc.service.PayProductService;
import com.bjpowernode.boss.utils.RedisUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 支付产品 控制类
 */
@RestController
@Slf4j
public class PayProductController {

    @Resource
    private PayProductService payProductService;

    @Resource
    private PayProductConvert payProductConvert;

    @Resource
    private RedisUtil redisUtil;

    @GetMapping("/product/pageList")
    public AjaxResult loadProductTableData(@RequestParam(defaultValue = "1") Integer pageNo) {
        log.info("要查询的支付产品的页数 : {}", pageNo);
        IPage<PayProduct> pageResult = payProductService.selectProductTablePageList(pageNo, BoosConst.PAGE_SIZE);

        // 查询分页数据信息
        long current = pageResult.getCurrent();
        long totalPage = pageResult.getPages();
        PageInfoDto pageInfoDto = PageInfoDto.builder().current(current).totalPage(totalPage).build();

        // 获取表格数据
        List<PayProduct> payProductList = pageResult.getRecords();
        // 封装数据
        Map<String, Object> data = new HashMap<>();
        data.put("page", pageInfoDto);
        data.put("list", payProductConvert.toConvertPayProductvoList(payProductList));
        return AjaxResult.ok(data);
    }

    @PostMapping("/product/add")
    public AjaxResult onAddProduct(@Validated @RequestBody PayProductQuery payProductQuery) {
        log.info("要添加的产品数据的信息 : {}", payProductQuery);
        payProductService.addProduct(payProductQuery);
        return AjaxResult.ok();
    }

    @GetMapping("/product/loadProductCodeAndNameOption")
    public AjaxResult loadPayProductOption() {
        log.info("加载支付产品的product_code 和 product_name");
        // 使用redis存储实现
        // 先查询redis中是否存在
        String key = KeyConst.OPERATOR_MENUS;
        List<DitOptionVo> ditOptionVoList = redisUtil.getData(
                () -> {
                    // 获取数据
                    String redisJsonStr = redisUtil.getValue(KeyConst.PAY_PRODUCT_DIC_CODE_AND_NAME);
                    // 解析数据
                    JSONArray jsonArray = JSONUtil.parseArray(redisJsonStr);
                    // array  --->  list
                    return jsonArray.toList(DitOptionVo.class);
                }
                ,
                () -> {
                    // 查询数据
                    List<PayProduct> payProductList = payProductService.selectProductCodeAndName();
                    // 转换数据
                    return payProductConvert.toConvertDitOptionVoList(payProductList);
                }
                ,
                (t) -> {
                    // 转换数据
                    String jsonStr = JSONUtil.toJsonStr(t);
                    // 存入数据
                    redisUtil.setValue(KeyConst.PAY_PRODUCT_DIC_CODE_AND_NAME, jsonStr, 5, TimeUnit.MINUTES);
                }
        );

       /*
        // 原方法
       List<PayProduct> payProductList = payProductService.selectProductCodeAndName();
        // 数据转换
        List<DitOptionVo> ditOptionVoList = payProductConvert.toConvertDitOptionVoList(payProductList);
        */
        return AjaxResult.ok(ditOptionVoList);
    }

    @GetMapping("/product/removeProduct")
    public AjaxResult removeProduct(@RequestParam String productCode) {
        log.info("要删除的支付产品的编号 : {}" , productCode);
        if (StrUtil.isNotBlank(productCode)) {
            payProductService.removeProductByCode(productCode);
            return AjaxResult.ok();
        }
        return AjaxResult.fail(Code.REQUEST_PARAM_ERR);
    }

    @GetMapping("/product/updateStatus")
    public AjaxResult updateProductStatus(@RequestParam String productCode) {
        log.info("要修改的产品编码为: {}" , productCode);
        if (StrUtil.isNotBlank(productCode)) {
            payProductService.updateProductStatus(productCode);
            return AjaxResult.ok();
        }
        return AjaxResult.fail(Code.REQUEST_PARAM_ERR);
    }


    @GetMapping("/product/payConfig/matchFind")
    public AjaxResult matchFindProductInfoList(@RequestParam String productName) {
        log.info("支付产品模糊查询 : {}" , productName);
        if (StrUtil.isNotBlank(productName) && productName.length() >= 1) {
            List<PayProduct> payProductList = payProductService.matchFindProductInfoList(productName);
            return AjaxResult.ok(payProductConvert.toConvertmppvList(payProductList));
        }
        return AjaxResult.fail(Code.REQUEST_PARAM_ERR);
    }

}
